home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1996 #15 / Monster Media Number 15 (Monster Media)(July 1996).ISO / prog_c / recio214.zip / RWARN.C < prev    next >
C/C++ Source or Header  |  1996-06-14  |  5KB  |  112 lines

  1. /*****************************************************************************
  2.    MODULE: rwarn.c
  3.   PURPOSE: recio warning functions
  4. COPYRIGHT: (C) 1994-1996, William Pierpoint
  5.  COMPILER: Borland C Version 3.1
  6.        OS: MSDOS Version 6.2
  7.   VERSION: 2.14
  8.   RELEASE: June 14, 1996
  9. *****************************************************************************/
  10.  
  11. #include <errno.h>
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <string.h>
  15.  
  16. #include "recio.h"
  17.  
  18. extern void _rsetexitfn(REC *rp);
  19.  
  20. #define rflags(rp)       ((rp)->r_flags)
  21.  
  22. static void (*_r_warnfn)(REC *) = NULL; /* ptr to warning function */
  23.  
  24. /****************************************************************************/
  25. void                         /* returns nothing                             */
  26.     rclearwarn(              /* clears warning indicator                    */
  27.         REC *rp)             /* record pointer                              */
  28. /****************************************************************************/
  29. {
  30.     if (risvalid(rp)) {
  31.         rflags(rp) &= ~(_R_WRN * _R_WRNMAX);
  32.     } else {
  33.         rseterr(NULL, EINVAL);
  34.     }
  35. }
  36.  
  37. /****************************************************************************/
  38. void                             /* returns nothing                         */
  39.     rsetwarnfn(                  /* registers a callback warning function   */
  40.         void(*rwarnfn)(REC *rp)) /* pointer to warning function             */
  41. /****************************************************************************/
  42. {
  43.     _r_warnfn = rwarnfn;         /* point to callback warning function */
  44.     _rsetexitfn(recin);          /* register exit function */
  45. }
  46.  
  47. /****************************************************************************/
  48. int                          /* returns warning number (0=no warning)       */
  49.     rwarning(                /* gets warning number for record stream       */
  50.         REC *rp)             /* record pointer                              */
  51. /****************************************************************************/
  52. {
  53.     int warnum=0;            /* return warning number */
  54.  
  55.     if (risvalid(rp)) {
  56.          warnum = rflags(rp) / _R_WRN;
  57.          warnum &= _R_WRNMAX;
  58.     }
  59.     return warnum;
  60. }
  61.  
  62. /****************************************************************************/
  63. int                          /* returns possibly modified warning number    */
  64.     rsetwarn(                /* sets warning number and calls warning fn    */
  65.         REC *rp,             /* record pointer                              */
  66.         int warnum)          /* warning number                              */
  67. /****************************************************************************/
  68. {
  69.     /* if valid record pointer */
  70.     if (risvalid(rp) && warnum <= _R_WRNMAX) {
  71.  
  72.         /* set warning number on stream */
  73.         rflags(rp) &= ~(_R_WRN * _R_WRNMAX);
  74.         rflags(rp) |= _R_WRN * warnum;
  75.  
  76.         /* invoke callback warning function */
  77.         if (_r_warnfn) _r_warnfn(rp);
  78.  
  79.         /* find out if warnfn() changed warning */
  80.         warnum = rwarning(rp);
  81.  
  82.     } else {
  83.         rseterr(rp, R_EINVAL);
  84.     }
  85.     return warnum;
  86. }
  87.  
  88. /****************************************************************************/
  89. char *                       /* returns warning message                     */
  90.     rstrwarning(             /* gets warning message for rwarning number    */
  91.         int warnum)          /* warning number                              */
  92. /****************************************************************************/
  93. {
  94.     switch (warnum) {
  95.     case 0:          return ("no warning");
  96.     case R_WEMPSTR:  return ("empty data string");
  97.     case R_WNOREG:   return ("unable to register function with atexit()");
  98.     case R_WWIDTH:   return ("data too wide for columnar output");
  99.     case R_WTMFMT:   return ("time data incomplete");
  100.     }
  101.     return ("unknown warning");
  102. }
  103.  
  104. /****************************************************************************/
  105. char *                       /* returns warning message                     */
  106.     rwarnstr(                /* gets warning message for record stream      */
  107.         REC *rp)             /* record pointer                              */
  108. /****************************************************************************/
  109. {
  110.     return (risvalid(rp) ? rstrwarning(rwarning(rp)) : rstrerror(R_EINVAL));
  111. }
  112.